/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.wicket_sapporo.workshop01.page.ajax.tree;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreeModel;
import org.apache.wicket.Component;
import org.apache.wicket.MarkupContainer;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.AjaxLink;
import org.apache.wicket.extensions.markup.html.repeater.tree.ITreeProvider;
import org.apache.wicket.extensions.markup.html.repeater.tree.NestedTree;
import org.apache.wicket.extensions.markup.html.repeater.tree.content.Folder;
import org.apache.wicket.extensions.markup.html.repeater.tree.theme.WindowsTheme;
import org.apache.wicket.extensions.markup.html.repeater.util.TreeModelProvider;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import org.wicket_sapporo.workshop01.page.WS01TemplatePage;
/**
* AJAXによるツリーを表示するサンプル.
*
* @author Hiroto Yamakawa
*/
public class AjaxTreePage extends WS01TemplatePage {
private static final long serialVersionUID = -6325140112961112579L;
private IModel<String> clickedTerminatory;
public AjaxTreePage() {
clickedTerminatory = Model.of("");
final Label clickedTerminatoryLabel = new Label("clickedTerminatory", clickedTerminatory) {
private static final long serialVersionUID = -4224953169066901644L;
@Override
protected void onInitialize() {
super.onInitialize();
setOutputMarkupId(true);
}
};
add(clickedTerminatoryLabel);
// 1. TreeModelを用意
TreeModel treeModel = new DefaultTreeModel(getTreeNode());
// 2. TreeModelProviderを用意
ITreeProvider<DefaultMutableTreeNode> treeProvider = new TreeModelProvider<DefaultMutableTreeNode>(treeModel) {
private static final long serialVersionUID = 3376187721454642989L;
@Override
public IModel<DefaultMutableTreeNode> model(DefaultMutableTreeNode arg0) {
return Model.of(arg0);
}
};
// 3. Treeコンポーネントに喰わせる
add(new NestedTree<DefaultMutableTreeNode>("tree", treeProvider) {
private static final long serialVersionUID = 5671307285170480665L;
@Override
protected void onInitialize() {
super.onInitialize();
add(new WindowsTheme());
}
@Override
protected Component newContentComponent(String id, IModel<DefaultMutableTreeNode> model) {
// 類似コンポーネントにCheckFolderもある。
return new Folder<DefaultMutableTreeNode>(id, this, model) {
private static final long serialVersionUID = -6100530316563823499L;
@Override
protected MarkupContainer newLinkComponent(String id, IModel<DefaultMutableTreeNode> model) {
// 子があれば通常のコンポーネントが提供するフォルダリンク、子が無ければ終端用のリンク
if (getProvider().hasChildren(model.getObject())) {
return super.newLinkComponent(id, model);
}
return new AjaxLink<DefaultMutableTreeNode>(id, model) {
private static final long serialVersionUID = -7710712071051731986L;
@Override
public void onClick(AjaxRequestTarget target) {
clickedTerminatory.setObject(getDefaultModelObjectAsString());
target.add(clickedTerminatoryLabel);
}
};
}
};
}
});
}
public DefaultMutableTreeNode getTreeNode() {
// 本来はDBや再帰処理などでツリーを作る
DefaultMutableTreeNode root = new DefaultMutableTreeNode("目次");
DefaultMutableTreeNode first = new DefaultMutableTreeNode("1章");
first.add(new DefaultMutableTreeNode("1.1"));
first.add(new DefaultMutableTreeNode("1.2"));
first.add(new DefaultMutableTreeNode("1.3"));
DefaultMutableTreeNode second = new DefaultMutableTreeNode("2章");
second.add(new DefaultMutableTreeNode("2.1"));
second.add(new DefaultMutableTreeNode("2.2"));
root.add(first);
root.add(second);
return root;
}
}